import { isEmpty, isNotEmpty } from '/@/utils/isUtils'
/*
 * @Description: 系统消息管理
 * @Author: DHL
 * @Date: 2022-11-27 15:51:45
 * @LastEditors: DHL
 * @LastEditTime: 2022-11-28 21:46:29
 */

import { defineComponent, computed, reactive, ref, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { assign, cloneDeep } from 'lodash-es'
import { TwTableOptions } from '/@/types/table.d'
import { arraySerializeToStr } from '/@/utils/twUtils'
import { usePermission } from '/@/hooks/web/permission'
import { MessageModel, MessagePageParams } from '/@/api/system/model/messageModel'
import {
  apiMessageLogicBatchDeleteByIds,
  apiMessageSearch,
  apiMessageExport,
  apiMessagePublish,
  apiMessageCancel
} from '/@/api/system/message'
import messageForm from './form.vue'

export default defineComponent({
  name: 'Message',
  components: { messageForm },
  setup(props) {
    //////////////////////////////////////////////////
    // 属性
    //////////////////////////////////////////////////

    const loading = ref(false)
    const loadingByDel = ref(false)

    // 权限控制
    const { hasPermission } = usePermission()

    /**
     * 表格数据
     */
    const tableData = ref()

    /**
     * 查询表单
     */
    const searchFormRef = ref()

    /**
     * 数据列表
     */
    const tableRef = ref()

    /**
     * 表单
     */
    const formRef = ref()

    /**
     * 公共
     */
    const state = reactive({})

    /**
     * 是否有选中的行
     */
    const isSelectRows = computed(() => {
      let selectRows: Array<MessageModel> = []
      if (tableRef.value) {
        selectRows = tableRef.value.getSelectRows()
      }
      return selectRows.length < 1
    })

    //////////////////////////////////////////////////
    // 查询表单
    //////////////////////////////////////////////////

    const defaultSearchForm = {
      queryLikeStr: '', // 模糊查询关键字
      id: null, // 编号
      creator: null, // 创建人
      updater: null, // 更新人
      createDate: null, // 创建时间
      updateDate: null, // 更新时间
      projectId: null, // 项目ID
      title: null, // 标题
      content: null, // 内容
      priority: null, // 优先级(1：最高；2：中间；3：最低）
      receivorType: null, // 接收方类型（1：全部；2：公司；3：部门；4：个人）
      receivorOrgIds: null, // 接收方为公司/部门的id
      type: null, // 消息类型（1：公告；2：通知；3-审批）
      sendDate: null, // 发送时间
      senderId: null, // 发送人ID
      sender: null, // 发送人
      status: null, // 状态（0：待发布；1：已发布；2：已撤销）
      revokeDate: null, // 撤销时间
      revokerId: null, // 撤销者ID
      revoker: null, // 撤销人
      revokeReason: null, // 撤销原因
      bizUrl: null // 业务页面地址
    }

    /**
     * 查询表单
     */
    const searchForm = reactive(cloneDeep(defaultSearchForm))

    //////////////////////////////////////////////////
    // 表格
    //////////////////////////////////////////////////

    /**
     * 表格配置
     */
    const tableOptions = reactive<TwTableOptions>({
      id: 'messageTable',
      sortConfig: {
        defaultSort: [{ field: 'updateDate', order: 'desc' }]
      },
      columns: [
        { type: 'checkbox', fixed: 'left', title: '', width: 40 },
        { type: 'seq', fixed: 'left', title: '序号', width: 50 },
        { field: 'projectName', title: '项目', sortable: true },
        { field: 'title', title: '标题', sortable: true },
        {
          field: 'priority',
          title: '优先级',
          sortable: true,
          params: { dict: 'MESSAGE_PRIORITY' }
        },
        {
          field: 'receivorType',
          title: '接收方类型 ',
          sortable: true,
          params: { dict: 'MESSAGE_RECEIVOR_TYPE' }
        },
        {
          field: 'type',
          title: '消息类型',
          sortable: true,
          params: { dict: 'MESSAGE_TYPE' }
        },
        { field: 'sendDate', title: '发送时间', sortable: true },
        { field: 'sender', title: '发送人', sortable: true },
        { field: 'status', title: '状态', sortable: true, params: { dict: 'MESSAGE_STATUS' } },
        { field: 'revokeDate', title: '撤销时间', sortable: true },
        { field: 'revoker', title: '撤销人', sortable: true },
        { field: 'revokeReason', title: '撤销原因', sortable: true },
        { field: 'updater', title: '更新人', sortable: true },
        { field: 'updateDate', title: '更新时间', sortable: true },
        { title: '操作', fixed: 'right', width: 150, slots: { default: 'action' } }
      ]
    })

    /**
     * 绑定事件
     */
    const tableEvents = reactive({
      cellDblclick(params: { row: MessageModel }) {
        if (hasPermission('MESSAGE-VIEW')) {
          handleOpenForm('view', params.row)
        } else {
          ElMessage.warning('无权限访问')
        }
      }
    })

    //////////////////////////////////////////////////
    // 函数
    //////////////////////////////////////////////////

    /**
     * 查询表格数据函数
     * @param queryParams
     */
    function searchList(queryParams: MessagePageParams) {
      loading.value = true
      apiMessageSearch(assign(queryParams, searchForm))
        .then((result) => {
          tableData.value = result
        })
        .catch(() => {})
        .finally(() => {
          loading.value = false
        })
    }

    /**
     * 查询表格数据
     */
    function handleSearch() {
      tableRef.value.handleQuery()
    }

    /**
     * 刷新
     */
    function handleRefresh() {
      tableRef.value.handleReload()
    }

    /**
     * 重置
     */
    function handleReset() {
      assign(searchForm, cloneDeep(defaultSearchForm))
      tableRef.value.handleQuery()
    }

    /**
     * 批量删除
     */
    function handleDelete(row?: MessageModel) {
      let selectRows: Array<MessageModel> = []

      if (row) {
        selectRows = [row]
      } else {
        selectRows = tableRef.value.getSelectRows()
      }

      if (selectRows.length === 0) {
        ElMessage.warning('请选择需要删除的数据')
        return
      }

      ElMessageBox.confirm(`此操作将删除${selectRows.length}条记录, 是否继续?`, '删除提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          loadingByDel.value = true
          const ids = arraySerializeToStr(selectRows, 'id')
          apiMessageLogicBatchDeleteByIds(ids)
            .then((result) => {
              if (result?.success) {
                handleRefresh()
                ElMessage.success(result.message)
              } else {
                ElMessage.error(result?.message)
              }
            })
            .catch(() => {})
            .finally(() => {
              loadingByDel.value = false
            })
        })
        .catch(() => {
          ElMessage.info('删除被取消了')
        })
    }

    /**
     * 弹出表单
     */
    function handleOpenForm(action: string, row?: MessageModel) {
      formRef.value.handleOpen(action, row)
    }

    /**
     * 导出
     */
    function handleExport(queryParams: MessagePageParams) {
      loading.value = true
      apiMessageExport(assign(queryParams, searchForm), '系统消息管理').finally(() => {
        loading.value = false
      })
    }

    /**
     * 发布
     * @param row
     */
    function handleRelease(row: MessageModel) {
      if (row.id) {
        loading.value = true
        apiMessagePublish(row.id)
          .then((result) => {
            if (result?.success) {
              ElMessage.success(result.message)
              handleRefresh()
            } else {
              ElMessage.error(result?.message)
            }
          })
          .finally(() => {
            loading.value = false
          })
      }
    }

    /**
     * 撤销发布
     * @param row
     */
    function handleCancel(row: MessageModel) {
      ElMessageBox.prompt('请输入撤销原因', '撤销提示', {
        confirmButtonText: '确 认',
        cancelButtonText: '取消',
        inputValidator: function (value) {
          return isNotEmpty(value)
        },
        inputErrorMessage: '请输出撤销原因'
      })
        .then(({ value }) => {
          loading.value = true
          apiMessageCancel(row.id || '', value)
            .then((result) => {
              if (result?.success) {
                ElMessage.success(result.message)
                handleRefresh()
              } else {
                ElMessage.error(result?.message)
              }
            })
            .finally(() => {
              loading.value = false
            })
        })
        .catch(() => {
          ElMessage({
            type: 'info',
            message: '取消撤销'
          })
        })
    }

    //////////////////////////////////////////////////
    // 生命周期
    //////////////////////////////////////////////////
    onMounted(() => {})

    return {
      loading,
      loadingByDel,
      tableData,
      searchFormRef,
      tableRef,
      formRef,
      state,
      searchForm,
      tableOptions,
      tableEvents,
      isSelectRows,
      searchList,
      handleSearch,
      handleRefresh,
      handleReset,
      handleDelete,
      handleOpenForm,
      handleExport,
      handleRelease,
      handleCancel
    }
  }
})
